2.01. Основы UNIX
Основы UNIX
UNIX — это операционная система, оказавшая глубокое влияние на развитие современных вычислительных платформ. Её концепции, архитектурные решения и философия проектирования легли в основу множества современных систем, включая Linux и macOS. UNIX зарекомендовала себя как надёжная, гибкая и мощная среда, особенно подходящая для задач, требующих стабильности, масштабируемости и контроля со стороны пользователя или администратора.
Архитектура UNIX
Архитектура UNIX строится вокруг нескольких ключевых компонентов: ядра, оболочки, файловой системы и набора утилит. Эти компоненты взаимодействуют между собой, образуя целостную экосистему, где каждый элемент выполняет свою роль.
Ядро (Kernel) — центральная часть операционной системы. Оно управляет ресурсами компьютера: процессорным временем, памятью, устройствами ввода-вывода. Ядро отвечает за планирование выполнения процессов, распределение памяти, обработку прерываний, работу с драйверами устройств, буферизацию данных на диске и обеспечение механизмов межпроцессного взаимодействия (IPC). В зависимости от реализации ядро может быть монолитным или модульным, что позволяет загружать и выгружать компоненты по мере необходимости.
Все пользовательские программы работают в так называемом пользовательском режиме, изолированном от ядра. Доступ к функциям ядра возможен только через системные вызовы — стандартизированный интерфейс, позволяющий программе запросить у ядра выполнение определённой операции: открытие файла, создание процесса, чтение с устройства и так далее. При выполнении системного вызова процесс временно переходит в режим ядра, получая доступ к привилегированным инструкциям и ресурсам. После завершения вызова управление возвращается в пользовательский режим.
Оболочка (Shell) — это интерпретатор команд, предоставляющий пользователю интерфейс для взаимодействия с системой. Оболочка принимает текстовые команды, анализирует их, запускает соответствующие программы и управляет потоками ввода-вывода. Наиболее распространённой оболочкой является Bash (Bourne Again Shell), но существуют и другие: Zsh, Ksh, Csh и другие. Оболочка не является частью ядра; она работает как обычный пользовательский процесс, но играет роль посредника между человеком и операционной системой.
Файловая система в UNIX имеет иерархическую структуру, начинающуюся с корневого каталога /. Все данные, включая устройства, процессы и даже сетевые ресурсы, представлены в виде файлов или каталогов. Такой подход обеспечивает единообразие и упрощает взаимодействие с различными типами объектов. Каждый файл характеризуется метаданными: владельцем, правами доступа, временем изменения, размером и типом.
Утилиты — это небольшие программы, каждая из которых решает одну конкретную задачу. Принцип UNIX гласит: «делай одну вещь и делай её хорошо». Благодаря этому утилиты легко комбинируются между собой, образуя сложные последовательности обработки данных. Например, вывод одной команды может стать входом для другой с помощью механизма конвейера (pipe).
Философия и ключевые особенности
UNIX построена на нескольких фундаментальных принципах:
- Многозадачность: система способна одновременно выполнять множество процессов, переключаясь между ними с высокой скоростью.
- Многопользовательность: несколько пользователей могут работать на одном компьютере независимо друг от друга, с собственными домашними каталогами, настройками и правами доступа.
- Конфигурация через текстовые файлы: параметры системы, приложений и пользовательских окружений хранятся в читаемых текстовых файлах, что упрощает автоматизацию, резервное копирование и восстановление.
- Переносимость: код ядра и приложений написан на языке C, что позволяет легко адаптировать систему под различные аппаратные платформы.
- Составляемость: простые утилиты объединяются в цепочки для решения сложных задач без необходимости создания новых программ.
Эти принципы обеспечивают гибкость, надёжность и долговечность UNIX-систем. Они остаются актуальными спустя десятилетия после появления первых версий.
Пользователи и группы
UNIX — многопользовательская система. Каждый пользователь имеет уникальный идентификатор пользователя (UID) и принадлежит хотя бы к одной группе, имеющей свой идентификатор группы (GID). Информация о пользователях и группах хранится в текстовых файлах:
/etc/passwd— содержит базовые данные о каждом пользователе: имя, UID, GID, домашний каталог, оболочку./etc/group— описывает группы и их участников./etc/shadow— хранит зашифрованные пароли и политики их смены; доступен только суперпользователю.
Особое положение занимает пользователь root (UID = 0). Он обладает полными правами на систему: может изменять любые файлы, запускать любые процессы, конфигурировать оборудование. Использование root-доступа требует осторожности, так как ошибки могут привести к повреждению системы.
Для временного перехода под другого пользователя используется команда su. Например, su - username запускает новую оболочку с окружением указанного пользователя. Команда passwd позволяет изменить пароль, а logins — просмотреть информацию о всех учётных записях.
Файловая система и типы файлов
В UNIX всё является файлом. Это не метафора, а архитектурное решение. Существует несколько типов файлов:
- Обычные файлы — содержат данные: текст, двоичный код, изображения. Для системы это просто последовательность байтов.
- Каталоги — специальные файлы, хранящие имена других файлов и ссылки на их метаданные. Создаются командой
mkdir. - Специальные файлы устройств — представляют физические или виртуальные устройства. Различают блочные (
b) и символьные (c) устройства. Блочные работают с данными порциями фиксированного размера (например, жёсткие диски), символьные — побайтово (например, терминалы). - Именованные каналы (FIFO) — позволяют передавать данные между процессами в порядке очереди. Создаются с помощью
mknod имя p. - Символические ссылки — файлы, содержащие путь к другому файлу. Они могут указывать на несуществующие объекты и пересекать границы файловых систем. Создаются командой
ln -s цель ссылка. - Жёсткие ссылки — дополнительные имена одного и того же файла в пределах одной файловой системы. Увеличивают счётчик ссылок в индексном дескрипторе. Удаление одной жёсткой ссылки не удаляет данные, пока существует хотя бы одна другая.
- Сокеты — используются для межпроцессного или сетевого взаимодействия. Представлены как файлы в файловой системе, но служат точками соединения.
Команда ls -l показывает тип файла первым символом в строке: - — обычный файл, d — каталог, l — символическая ссылка, c/b — устройства, p — FIFO, s — сокет.
Для определения типа файла более точно применяется команда file, которая анализирует содержимое и пытается классифицировать его: текст, исполняемый файл, архив и так далее.
Работа с командной строкой
Командная строка — основной инструмент взаимодействия с UNIX. Каждая команда — это программа, запускаемая оболочкой. Многие команды являются встроенными в оболочку (например, cd, export), другие — внешними утилитами (ls, grep, awk).
Основные команды
ls— список файлов и каталогов.cd— смена текущего каталога.pwd— вывод полного пути текущего каталога.cp— копирование файлов.mv— перемещение или переименование.rm— удаление файлов.mkdir,rmdir— создание и удаление каталогов.cat— вывод содержимого файла.head,tail— показ начала или конца файла.grep— поиск строк по шаблону.sort— сортировка строк.wc— подсчёт строк, слов, байтов.find— рекурсивный поиск файлов по различным критериям.chmod— изменение прав доступа.echo— вывод текста.man— справка по командам и системным вызовам.
Перенаправление и конвейеры
UNIX использует мощные механизмы управления потоками:
>— перенаправление вывода в файл (перезапись).>>— добавление вывода в конец файла.<— перенаправление ввода из файла.|— передача вывода одной команды на вход другой (конвейер).
Пример:
grep "error" /var/log/syslog | tail -n 20 | wc -l
Эта команда находит строки с «error» в логе, берёт последние 20 из них и считает их количество.
Специальные символы
$— начало приглашения оболочки (обычно для обычного пользователя; у root —#).#— начало комментария в скриптах или приглашение root.&— запуск команды в фоновом режиме.;— разделение нескольких команд в одной строке.&&,||— условное выполнение (только при успехе или неудаче предыдущей команды).
Скрипты и автоматизация
Оболочка поддерживает написание сценариев (shell-скриптов) — последовательностей команд, сохранённых в файле. Скрипты могут содержать переменные, условия, циклы и функции.
Переменные задаются без пробелов вокруг =:
NAME="Alice"
echo $NAME
Условные конструкции:
if [ -f /tmp/file ]; then
echo "Файл существует"
else
echo "Файла нет"
fi
Циклы:
for i in 1 2 3; do
echo "Итерация $i"
done
Автоматизация задач достигается с помощью cron — демона, запускающего команды по расписанию. Пользователь редактирует своё расписание командой crontab -e.
Процессы и сигналы
Каждая запущенная программа становится процессом, имеющим уникальный PID (Process ID). Процессы могут быть запущены в фоне (&), переведены на передний план (fg) или отправлены в фон (bg). Команда ps показывает список процессов, kill — отправляет сигнал процессу.
Сигналы — это способ взаимодействия с процессами. Наиболее известные:
SIGTERM(15) — запрос на корректное завершение. Процесс может обработать его и завершиться аккуратно.SIGKILL(9) — немедленное завершение без возможности обработки.SIGHUP— часто используется для перезагрузки конфигурации демонов.
Команда kill -15 PID отправляет SIGTERM, давая процессу шанс завершиться правильно.
Код возврата
Каждая команда завершается с кодом возврата (exit code). Нулевой код означает успешное выполнение, ненулевой — ошибку. Этот код доступен через переменную $? и используется в условиях и скриптах для принятия решений.
Пример:
ls /nonexistent
echo $? # выведет 2 (ошибка)
Наследие UNIX
UNIX породила множество потомков. Linux — свободная реализация, ставшая основой большинства серверов, облачных систем и Android. macOS — сертифицированная UNIX-система, сочетающая графический интерфейс с мощной командной строкой. BSD (FreeBSD, OpenBSD, NetBSD) — прямые наследники оригинального кода AT&T, отличающиеся стабильностью и чистотой архитектуры.
Несмотря на разнообразие, все эти системы сохраняют общие черты: иерархическую файловую систему, оболочку, утилиты, права доступа, процессы и сигналы. Знание основ UNIX открывает доступ к пониманию работы современных операционных систем на глубоком уровне.
Права доступа и управление ресурсами
В UNIX каждый файл и каталог имеет набор атрибутов, определяющих, кто и как может с ним взаимодействовать. Эти атрибуты называются правами доступа (permissions). Они делятся на три категории:
- Владелец (user) — пользователь, создавший файл или получивший право собственности.
- Группа (group) — группа, к которой принадлежит файл.
- Остальные (others) — все остальные пользователи системы.
Для каждой категории определены три базовых права:
- r (read) — разрешение на чтение содержимого файла или списка файлов в каталоге.
- w (write) — разрешение на изменение содержимого файла или добавление/удаление файлов в каталоге.
- x (execute) — для файлов это право на запуск как программы; для каталогов — право на вход (
cd) и доступ к содержимому.
Права отображаются в длинном формате команды ls -l в виде строки вида -rwxr-xr--. Первый символ указывает тип файла (например, - — обычный файл, d — каталог), следующие девять — права для владельца, группы и остальных по три символа.
Изменение прав выполняется командой chmod. Она поддерживает два режима записи:
-
Символьный:
chmod u+x script.sh # добавить владельцу право на выполнение
chmod go-w file.txt # убрать у группы и остальных право на запись -
Числовой (восьмеричный):
Каждое право кодируется битами:r=4,w=2,x=1. Сумма даёт число от 0 до 7.chmod 755 script.sh # rwx для владельца, r-x для группы и остальных
chmod 644 document.txt # rw- для владельца, r-- для остальных
Владелец файла может быть изменён только суперпользователем с помощью команды chown:
chown alice:developers project/
Эта команда делает пользователя alice владельцем, а группу developers — группой-владельцем каталога project.
Для каталогов право на выполнение (x) особенно важно: без него невозможно получить доступ к файлам внутри, даже если есть права на чтение самого каталога.
Специальные права: sticky bit, setuid, setgid
UNIX поддерживает расширенные атрибуты, влияющие на поведение файлов и каталогов:
-
Sticky bit (
tв конце прав, напримерdrwxrwxrwt) — применяется к каталогам. Он гарантирует, что только владелец файла или root может удалить файл из этого каталога, даже если у других есть право на запись. Обычно используется в/tmp.chmod +t /shared -
Setuid (
sв позиции владельца, например-rwsr-xr-x) — при запуске исполняемого файла процесс получает права владельца файла, а не запустившего пользователя. Это позволяет обычным пользователям временно выполнять привилегированные операции (например,passwd).chmod u+s /usr/bin/mytool -
Setgid (
sв позиции группы) — аналогично, но процесс наследует группу владельца. Если применено к каталогу, все новые файлы внутри наследуют группу каталога, а не основную группу пользователя.chmod g+s /project/shared
Эти механизмы требуют осторожного использования, так как могут создавать уязвимости при неправильной настройке.
Управление пользователями и группами
Администрирование пользователей в UNIX осуществляется через текстовые файлы и специализированные утилиты.
Помимо просмотра файлов /etc/passwd, /etc/group и /etc/shadow, администратор использует команды:
useradd— создание нового пользователя.userdel— удаление пользователя.groupadd,groupdel— управление группами.passwd— смена пароля.id— отображение UID, GID и групп текущего пользователя.
Пример создания пользователя:
useradd -m -s /bin/bash developer
passwd developer
Флаг -m создаёт домашний каталог, -s задаёт оболочку.
Группы позволяют упростить управление доступом. Пользователь может быть добавлен в дополнительные группы:
usermod -aG docker alice
Теперь alice может работать с Docker без sudo, если демон настроен на группу docker.
Файловая система: устройство и монтирование
Физически данные хранятся на разделах дисков. Каждый раздел форматируется в определённую файловую систему (ext4, XFS, ZFS и другие). Логическая файловая система UNIX объединяет все такие разделы в единое дерево, начиная с /.
Процесс подключения раздела к дереву называется монтированием. Например:
mount /dev/sdb1 /mnt/data
Теперь содержимое диска /dev/sdb1 доступно через /mnt/data.
Информация о смонтированных файловых системах хранится в /etc/fstab — файле, используемом при загрузке системы для автоматического монтирования. Пример записи:
/dev/sda2 /home ext4 defaults 0 2
Команда df -h показывает использование дискового пространства, du -sh * — размер файлов и каталогов в текущей директории.
Механизмы поиска и фильтрации
UNIX предоставляет мощные инструменты для поиска и обработки данных.
grep — поиск строк по шаблону (регулярному выражению):
grep "ERROR" logfile.txt
grep -r "TODO" ~/project/ # рекурсивный поиск
find — поиск файлов по имени, типу, времени изменения, размеру:
find /var/log -name "*.log" -mtime -7 # логи за последнюю неделю
find . -type f -size +100M # файлы больше 100 МБ
awk — язык для обработки текстовых данных по колонкам:
awk '{print $1}' /etc/passwd # вывести первый столбец
awk -F: '$3 > 1000 {print $1}' /etc/passwd # пользователи с UID > 1000
sed — потоковый редактор для замены, удаления, вставки текста:
sed 's/foo/bar/g' file.txt # заменить все "foo" на "bar"
sed -i 's/old/new/g' file.txt # изменить файл на месте
Эти утилиты часто комбинируются:
ps aux | grep nginx | awk '{print $2}' | xargs kill
Эта цепочка находит PID процессов nginx и завершает их.
Планировщик задач: cron
Автоматизация повторяющихся задач достигается через cron — системный демон, запускающий команды по расписанию.
Каждый пользователь имеет своё расписание, редактируемое командой:
crontab -e
Формат строки:
минута час день_месяца месяц день_недели команда
Примеры:
0 2 * * * /backup.sh # ежедневно в 2:00
*/10 * * * * /check_status.sh # каждые 10 минут
Результаты выполнения (вывод, ошибки) обычно отправляются на email пользователя или записываются в лог.
Работа с различиями: diff и patch
Команда diff сравнивает два файла и выводит различия:
diff old.conf new.conf
Формат вывода можно использовать для создания патча — файла с инструкциями по преобразованию одного файла в другой:
diff -u old.conf new.conf > fix.patch
patch old.conf < fix.patch
Этот механизм широко применяется в разработке программного обеспечения для распространения изменений.
Контроль целостности: sha1sum и аналоги
Для проверки целостности файлов используются хеш-функции. Команда sha1sum вычисляет контрольную сумму:
sha1sum document.pdf
Результат можно сохранить и позже проверить:
sha1sum -c checksums.sha1
Современные системы предпочитают более надёжные алгоритмы: sha256sum, sha512sum.